package com.gitee.helioz.openai.common.constants;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

/**
 * 〈API接口URL〉
 *
 * @author <a href="https://gitee.com/helioz">Morning Starr</a>
 */
public interface OpenAiApiUrl {

    /**
     * the path
     *
     * @return path
     */
    String getPath();

    @Getter
    @AllArgsConstructor
    enum Models implements OpenAiApiUrl {
        /**
         * 列出当前可用的模型，并提供每个模型的基本信息，如所有者和可用性
         */
        LIST("/models"),
        /**
         * 检索模型实例，提供有关模型的基本信息，如所有者和权限
         */
        RETRIEVE("/models/"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Completions implements OpenAiApiUrl {
        /**
         * 为提供的提示和参数创建补全
         */
        CREATE("/completions"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Chat implements OpenAiApiUrl {
        /**
         * 为给定的聊天对话创建模型响应
         */
        CREATE_CHAT_COMPLETION("/chat/completions"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Edits implements OpenAiApiUrl {
        /**
         * 为提供的输入、指令和参数创建新编辑
         */
        CREATE_EDIT("/edits"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Images implements OpenAiApiUrl {
        /**
         * 在给出提示的情况下创建图像
         */
        CREATE_IMAGE("/images/generations"),
        /**
         * 在给定原始图像和提示的情况下创建编辑过的或扩展过的图像
         */
        CREATE_IMAGE_EDIT("/images/edits"),
        /**
         * 创建给定图像的变体
         */
        CREATE_IMAGE_VARIATION("/images/variations"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Embeddings implements OpenAiApiUrl {
        /**
         * 创建表示输入文本的嵌入向量
         */
        CREATE_EMBEDDINGS("/embeddings"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Audio implements OpenAiApiUrl {
        /**
         * 将音频转录为输入语言
         */
        CREATE_TRANSCRIPTION("/audio/transcriptions"),
        /**
         * 将音频翻译成英语
         */
        CREATE_TRANSLATION("/audio/translations"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Files implements OpenAiApiUrl {
        /**
         * 返回属于用户组织的文件列表
         */
        LIST("/files"),
        /**
         * 上传包含要跨各种端点/功能使用的文档的文件。目前，一个组织上传的所有文件的大小最高可达1GB。
         */
        UPLOAD("/files"),
        /**
         * 删除指定的文件
         */
        DELETE("/files/"),
        /**
         * 返回指定文件的信息
         */
        RETRIEVE("/files/"),
        /**
         * 返回指定文件的内容
         */
        RETRIEVE_CONTENT_FORMAT("/files/%s/content"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum FineTunes implements OpenAiApiUrl {
        /**
         * 创建一个作业，用于根据给定的数据集微调指定的模型。
         */
        CREATE("/fine-tunes"),
        /**
         * 列出贵组织的微调作业列表
         */
        LIST("/fine-tunes"),
        /**
         * 获取指定微调作业的信息
         */
        RETRIEVE("/fine-tunes/"),
        /**
         * 立即取消微调作业
         */
        CANCEL_FORMAT("/fine-tunes/%s/cancel"),
        /**
         * 获取微调作业的细粒度状态更新
         */
        LIST_EVENTS_FORMAT("/fine-tunes/%s/events"),
        /**
         * 删除微调的模型。您必须在组织中拥有所有者角色
         */
        DELETE_MODEL("/models/"),
        ;

        private final String path;
    }

    @Getter
    @AllArgsConstructor
    enum Moderations implements OpenAiApiUrl {
        /**
         * 如果文本违反OpenAI的内容政策，则进行分类
         */
        CREATE("/moderations"),
        ;

        private final String path;
    }

    /**
     * 获取接口地址
     *
     * @param customApiHost 自定义域名
     * @return {@link String} 接口地址
     */
    default String getUrl(String customApiHost) {
        String defaultApiHost = OpenAiConstants.API_DOMAIN_V1;
        if (StringUtils.isNotBlank(customApiHost) && !StringUtils.equals(customApiHost, defaultApiHost)) {
            defaultApiHost = customApiHost;
        }
        return defaultApiHost + this.getPath();
    }
}
